#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>



//郝代码


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("电力市场仿真交易平台");
    //添加搜索功能
    ui->label->setText("<h1><a href=\"https://www.baidu.com\">百度一下很轻松</a></h1>");
    ui->label->setOpenExternalLinks(true);
    // 初始化窗口
    marketWindow = new MarketWindow(this);
    analysisWindow = new AnalysisWindow(this);
    
    // 连接信号槽获取交点坐标
    connect(marketWindow, &MarketWindow::intersectionFound, 
            this, [=](const QPointF &point) {
        intersectionPoint = point;
    });
    // --------------------------
    // 关键：为中央部件设置布局管理器
    // --------------------------
    // 1. 获取主窗口的中央部件（所有控件应放在centralWidget中）
    QWidget *centralWidget = this->centralWidget();

    // 2. 创建布局管理器（根据需求选择QVBoxLayout、QHBoxLayout或QGridLayout）
    // 这里以垂直布局为例，可根据控件排列方式调整
     QGridLayout *mainLayout = new QGridLayout(centralWidget);
    // 3. 将所有需要自适应的控件添加到布局中
    // （如果控件是通过ui文件创建的，直接添加ui->控件名即可）
      mainLayout->addWidget(ui->toolBar);
     // 添加示例中的label控件
    // 如果有其他控件（如按钮、表格等），继续用addWidget添加
    mainLayout->addWidget(ui->titleLabel);
    mainLayout->addWidget(ui->contentLabel);
    mainLayout->addWidget(ui->label);
    // 4. 设置布局到中央部件（若中央部件原本无布局，这一步会覆盖默认设置）
    centralWidget->setLayout(mainLayout);

    // 可选：设置布局的边距和控件间距（优化显示效果）
    mainLayout->setContentsMargins(10, 10, 10, 10);  // 布局与窗口边缘的距离
    mainLayout->setSpacing(10);  // 控件之间的距离
}



//戴代码



MainWindow::~MainWindow()
{
    delete ui;
    delete marketWindow;
    delete analysisWindow;
}

void MainWindow::on_actionUserClient_triggered()
{
    // 用户端登录
    LoginDialog loginDialog(CONSUMER, this);
    if (loginDialog.exec() == QDialog::Accepted) {
        // 保存用户端竞价数据
        consumerBidData = loginDialog.getBidData();
    }
}

void MainWindow::on_actionPowerSupplier_triggered()
{
    // 供电端登录
    LoginDialog loginDialog(SUPPLIER, this);
    if (loginDialog.exec() == QDialog::Accepted) {
        // 保存供电端竞价数据
        supplierBidData = loginDialog.getBidData();
    }
}

void MainWindow::on_actionTradingMarket_triggered()
{
    // 检查是否有竞价数据
    if (supplierBidData.isEmpty() || consumerBidData.isEmpty()) {
        QMessageBox::warning(this, "数据不足", "请先登录并提交供电端和用户端的竞价数据！");
        return;
    }
    
    // 设置竞价数据并显示交易市场
    marketWindow->setBidData(supplierBidData, consumerBidData);
    marketWindow->show();
}



//郝代码


void MainWindow::on_actionDataAnalysis_triggered()
{
    // 显示数据分析
    // analysisWindow->setIntersectionPoint(intersectionPoint);
    // analysisWindow->show();
    // 创建弹窗
    // 创建非模态数据分析弹窗，设置父窗口为当前主窗口
    QDialog *analysisDialog = new QDialog(this);
    analysisDialog->setWindowTitle("电力市场数据分析 - 指标含义说明");
    analysisDialog->resize(800, 600); // 设置初始大小
    analysisDialog->setAttribute(Qt::WA_DeleteOnClose); // 关闭时自动释放内存

    // 创建文本编辑控件（只读）
    QTextEdit *textEdit = new QTextEdit(analysisDialog);
    textEdit->setReadOnly(true);
    textEdit->setFont(QFont("SimHei", 10)); // 确保中文正常显示
    textEdit->setLineWrapMode(QTextEdit::WidgetWidth); // 自动换行

    // 构建层次化HTML内容
    QString content = R"(
        <html>
        <head>
            <style>
                h1 {
                    color: #2c3e50;
                    text-align: center;
                    border-bottom: 2px solid #3498db;
                    padding-bottom: 10px;
                    margin: 10px 0 20px 0;
                }
                h2 {
                    color: #34495e;
                    margin: 20px 0 15px 0;
                    border-left: 4px solid #3498db;
                    padding-left: 10px;
                }
                p {
                    line-height: 1.8;
                    margin: 10px 0;
                    text-indent: 2em;
                }
                .highlight {
                    color: #e74c3c;
                    font-weight: bold;
                }
                ul {
                    margin: 10px 0 10px 20px;
                }
                li {
                    line-height: 1.8;
                    margin: 5px 0;
                }
                .section {
                    margin-bottom: 25px;
                    padding: 0 10px;
                }
            </style>
        </head>
        <body>
            <h1>电力市场核心指标含义解析</h1>

            <div class="section">
                <h2>一、均衡点（交点坐标）分析</h2>
                <p>交点坐标（X, Y）代表电力市场供需平衡的核心参数：</p>
                <ul>
                    <li><span class="highlight">X轴（横坐标）</span>：均衡电量（单位：电量单位）<br>
                        表示供电端愿意提供的总电量与用户端愿意购买的总电量完全相等时的电量值。</li>
                    <li><span class="highlight">Y轴（纵坐标）</span>：均衡电价（单位：元/单位电量）<br>
                        表示供电端最低可接受价格与用户端最高愿意支付价格达成一致的价格水平。</li>
                </ul>
                <p><strong>市场解读：</strong><br>
                - 若实际电价 > 均衡电价：供过于求，市场将自发降价调节<br>
                - 若实际电价 < 均衡电价：供不应求，市场将自发涨价调节<br>
                - 均衡点是资源配置效率最高的理想状态</p>
            </div>

            <div class="section">
                <h2>二、用户侧（需求曲线）积分含义</h2>
                <p>用户侧积分是需求曲线与均衡电量垂线围成的面积，代表：</p>
                <p class="highlight">用户端为获取均衡电量所愿意支付的总金额（消费者总支付意愿）</p>
                <p><strong>计算逻辑：</strong>对阶梯式需求数据按电价递减排序，累加各阶梯在均衡电量内的有效电量×对应电价。</p>
                <p><strong>经济意义：</strong>反映用户对电力的总体价值认可，数值越大说明用户认为该电量的总价值越高。</p>
            </div>

            <div class="section">
                <h2>三、供电侧（供给曲线）积分含义</h2>
                <p>供电侧积分是供给曲线与均衡电量垂线围成的面积，代表：</p>
                <p class="highlight">供电端提供均衡电量时获得的总收入（生产者总收益）</p>
                <p><strong>计算逻辑：</strong>对阶梯式供给数据按电价递增排序，累加各阶梯在均衡电量内的有效电量×对应电价。</p>
                <p><strong>经济意义：</strong>反映供电端提供对应电量所需的最低收益补偿，由供电成本和利润预期决定。</p>
            </div>

            <div class="section">
                <h2>四、社会福祉（积分差值）含义</h2>
                <p>社会福祉定义为「用户侧积分 - 供电侧积分」，代表：</p>
                <p class="highlight">电力市场交易产生的总社会福利（净经济价值）</p>
                <p><strong>构成部分：</strong>
                - 消费者剩余（用户实际支付低于意愿支付的部分）<br>
                - 生产者剩余（供电端实际收益高于最低可接受收益的部分）</p>
                <p><strong>经济意义：</strong>数值越大说明市场交易为社会创造的净价值越高，均衡点处的社会福祉为当前市场条件下的最大值。</p>
            </div>
        </body>
        </html>
    )";

    textEdit->setHtml(content);

    // 设置布局让文本框充满弹窗
    QVBoxLayout *layout = new QVBoxLayout(analysisDialog);
    layout->setContentsMargins(15, 15, 15, 15); // 设置边距
    layout->addWidget(textEdit);
    analysisDialog->setLayout(layout);

    // 显示非模态窗口
    analysisDialog->show();

}
//郝代码

void MainWindow::on_actionExit_triggered()
{
    // 弹出"是否退出"确认对话框
    int result = QMessageBox::question(
        this,                  // 父窗口（确保弹窗置顶）
        "确认退出",            // 弹窗标题
        "你是否要退出电力系统仿真交易平台？",  // 弹窗提示内容
        QMessageBox::Yes | QMessageBox::No  // 显示"是"和"否"按钮
        );

    // 判断用户选择：若点击"Yes"，则退出应用
    if (result == QMessageBox::Yes)
    {
        // qApp是全局应用对象指针，quit()用于退出应用
        qApp->quit();
    }
    // 点击"No"则不做任何操作，弹窗自动关闭
}


void MainWindow::on_action_triggered()
{

    // 创建使用说明弹窗
    QDialog *usageDialog = new QDialog(this);
    usageDialog->setWindowTitle("电力交易仿真平台 - 完整使用说明");
    usageDialog->resize(800, 600); // 设置弹窗初始大小

    // 创建文本编辑控件用于显示内容（只读）
    QTextEdit *textEdit = new QTextEdit(usageDialog);
    textEdit->setReadOnly(true);
    textEdit->setFont(QFont("SimHei", 10)); // 确保中文正常显示
    textEdit->setLineWrapMode(QTextEdit::WidgetWidth); // 自动换行

    // 构建带层次的HTML内容（完整代码使用说明）
    QString content = R"(
        <html>
        <head>
            <style>
                body { margin: 0; padding: 0; }
                h1 { color: #2c3e50; text-align: center; border-bottom: 2px solid #3498db; padding: 10px 0; margin: 0 0 20px 0; }
                h2 { color: #34495e; margin: 25px 0 15px 0; border-left: 4px solid #3498db; padding-left: 10px; }
                h3 { color: #2980b9; margin: 15px 0 10px 0; }
                p { line-height: 1.8; margin: 10px 0; }
                .highlight { color: #e74c3c; font-weight: bold; }
                ul { margin: 10px 0 10px 20px; }
                li { line-height: 1.8; margin: 5px 0; }
                .code-block { background-color: #f8f9fa; padding: 10px; border-radius: 4px; margin: 10px 0; font-family: Consolas, monospace; }
                .section { margin-bottom: 30px; }
            </style>
        </head>
        <body>
            <h1>电力交易仿真平台 完整使用说明</h1>

            <div class="section">
                <h2>一、系统概述</h2>
                <p>本平台是一个电力市场交易仿真系统，支持供电端与用户端的竞价交易流程，通过可视化曲线展示供需关系，自动计算市场均衡点，并提供数据分析功能。</p>
                <p>核心模块包括：登录模块、竞价提交模块、交易市场模块、数据分析模块。</p>
            </div>

            <div class="section">
                <h2>二、操作流程详解</h2>

                <h3>1. 登录与注册</h3>
                <ul>
                    <li>通过顶部菜单栏选择用户类型（供电端/用户端）</li>
                    <li>登录界面默认账号：用户名100，密码100</li>
                    <li>新用户可通过"注册"按钮创建账号（输入用户名和密码后点击注册）</li>
                    <li>注册成功后需重新登录方可进入竞价界面</li>
                </ul>

                <h3>2. 竞价数据提交</h3>
                <ul>
                    <li>登录成功后自动进入竞价提交界面</li>
                    <li>需填写8组价格-电量数据：
                        <ul>
                            <li>电价：非负数值（>= 0）</li>
                            <li>电量：正数值（> 0）</li>
                        </ul>
                    </li>
                    <li>数据排序规则：
                        <ul>
                            <li>供电端：系统自动按电价<strong>递增</strong>排序</li>
                            <li>用户端：系统自动按电价<strong>递减</strong>排序</li>
                        </ul>
                    </li>
                    <li>填写完成后点击"提交"按钮，系统提示"提交成功"则完成操作</li>
                </ul>

                <h3>3. 交易市场曲线查看</h3>
                <ul>
                    <li>前提条件：需同时获取供电端和用户端的有效竞价数据</li>
                    <li>打开路径：顶部菜单栏 → "交易市场"</li>
                    <li>曲线说明：
                        <ul>
                            <li>蓝色曲线：供电端价格-电量曲线（阶梯式递增）</li>
                            <li>红色曲线：用户端价格-电量曲线（阶梯式递减）</li>
                            <li>绿色圆点：供需均衡点（交点）</li>
                        </ul>
                    </li>
                    <li>系统自动计算并显示交点坐标及积分数据</li>
                </ul>

                <h3>4. 数据分析与账单查看</h3>
                <ul>
                    <li>数据分析：展示均衡点坐标、均衡电量、均衡电价及市场解读</li>
                    <li>账单查看：点击"查看账单"按钮可显示：
                        <ul>
                            <li>客户端支出（用户侧积分）</li>
                            <li>供电端汇入（供电侧积分）</li>
                            <li>社会福祉（用户侧积分 - 供电侧积分）</li>
                        </ul>
                    </li>
                </ul>
            </div>

            <div class="section">
                <h2>三、数据规则与限制</h2>
                <ul>
                    <li>所有输入数据必须为有效的数字（支持整数和小数）</li>
                    <li>电价不能为负数，电量必须为正数</li>
                    <li>每组竞价数据需完整填写，不可为空</li>
                    <li>必须同时提交供电端和用户端数据才能生成交易曲线</li>
                    <li>若供需曲线无交点，系统将提示"未找到有效交点"</li>
                </ul>
            </div>

            <div class="section">
                <h2>四、核心功能模块说明</h2>
                <h3>1. LoginDialog（登录对话框）</h3>
                <p>负责用户登录与注册功能，验证用户信息，登录成功后跳转至竞价界面。</p>

                <h3>2. BidWindow（竞价窗口）</h3>
                <p>接收用户输入的价格-电量数据，进行有效性验证，并根据用户类型自动排序。</p>

                <h3>3. MarketWindow（交易市场窗口）</h3>
                <p>可视化展示供需曲线，计算并标记供需均衡点，支持曲线交互查看。</p>

                <h3>4. AnalysisWindow（分析窗口）</h3>
                <p>分析均衡点数据，生成专业含义。</p>
            </div>

            <div class="section">
                <h2>五、常见问题解决</h2>
                <ul>
                    <li><strong>无法生成交易曲线：</strong>检查是否已提交双方数据，数据是否符合格式要求</li>
                    <li><strong>无有效交点：</strong>调整竞价数据范围，确保供需曲线存在重叠区间</li>
                    <li><strong>中文显示异常：</strong>系统已默认配置SimHei字体，若仍有问题请检查系统字体库</li>
                    <li><strong>数据提交失败：</strong>检查是否所有输入框都填写了有效数值（电价非负，电量为正）</li>
                </ul>
            </div>
        </body>
        </html>
    )";

    // 设置文本内容（支持HTML格式）
    textEdit->setHtml(content);

    // 设置布局让文本框充满弹窗
    QVBoxLayout *layout = new QVBoxLayout(usageDialog);
    layout->setContentsMargins(15, 15, 15, 15); // 设置边距
    layout->addWidget(textEdit);
    usageDialog->setLayout(layout);

    // 显示弹窗（模态，阻止其他操作直到关闭）
    usageDialog->exec();

    // 手动释放内存
    delete usageDialog;
}

